/*
 * Medico.java
 *
 * Created on 19 de Maio de 2007, 17:48
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package pt.iscte.dcti.es.rhplus.utilizador;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.LinkedList;

import pt.iscte.dcti.es.rhplus.sistema.CodigoPostal;
import pt.iscte.dcti.es.rhplus.sistema.persistencia.AcessoBD;

public class Medico extends Colaborador {

    private String especialidade;

    /** Creates a new instance of Medico */
    public Medico(final int id_pessoa, final String nome, final char sexo, final int bi, final Date data_de_nascimento, final int nif,
            final String email, final int telefone, final int telemovel, final String morada, final String grupo_sanguineo,
            final CodigoPostal codigo_postal, final String nib, final String nss, final Date data_admissao, final double vencimento,
            final Date validade_contrato, final String horario_trabalho, final int numero_de_colaborador, final String especialidade,
            final int id_hospital, final String horario_trabalho2, final int id_hospital2) {

        super(id_pessoa, nome, sexo, bi, data_de_nascimento, nif, email, telefone, telemovel, morada, grupo_sanguineo, codigo_postal, nib, nss,
                data_admissao, vencimento, validade_contrato, horario_trabalho, numero_de_colaborador, id_hospital, horario_trabalho2, id_hospital2);

        this.especialidade = especialidade;
    }

    public String getEspecialidade() {
        return especialidade;
    }

    public String getTipo() {
        return "medico";
    }

    public static Medico devolve(final String username)
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {

        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();

        String qryName = new String("visualizar_colaborador_por_username");

        Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
        dados_da_pessoa.put("var_username", username);

        ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_pessoa);
        result_set.next();

        int id_codigo_postal = result_set.getInt("id_codigo_postal");

        // Cria o Membro do Agregado e os outros elementos necessarios
        int id_pessoa = result_set.getInt("id_pessoa");
        int id_hospital = result_set.getInt("id_hospital");
        int id_hospital2 = result_set.getInt("id_hospital2");
        int numero_de_colaborador = result_set.getInt("id_colaborador");
        String nome = result_set.getString("nome");
        char sexo = result_set.getString("sexo").charAt(0);
        int bi = result_set.getInt("bi");
        Date data_de_nascimento = result_set.getDate("data_de_nascimento");
        int nif = result_set.getInt("nif");
        String email = result_set.getString("email");
        int telefone = result_set.getInt("telefone");
        int telemovel = result_set.getInt("telemovel");
        String morada = result_set.getString("morada");
        String grupo_sanguineo = result_set.getString("grupo_sanguineo");
        String nib = result_set.getString("nib");
        String nss = result_set.getString("nss");
        Date data_admissao = result_set.getDate("data_admissao");
        Double vencimento = result_set.getDouble("vencimento");
        Date validade_contrato = result_set.getDate("validade_contrato");
        String horario_trabalho = result_set.getString("horario_trabalho");
        String horario_trabalho2 = result_set.getString("horario_trabalho2");
        String especialidade = result_set.getString("especialidade");


        acesso_bd.fechaLigacao();

        CodigoPostal codigo_postal = CodigoPostal.devolve(id_codigo_postal);

        Medico medico = new Medico(id_pessoa, nome, sexo, bi, data_de_nascimento, nif, email, telefone, telemovel, morada, grupo_sanguineo,
                codigo_postal, nib, nss, data_admissao, vencimento, validade_contrato, horario_trabalho, numero_de_colaborador, especialidade,
                id_hospital, horario_trabalho2, id_hospital2);

        medico.toString();

        return medico;
    }

    public static Medico devolve(final int id_pessoa)
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        // Consulta a BD

        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();

        String qryName = new String("visualizar_colaborador_por_id");

        Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
        dados_da_pessoa.put("var_id_pessoa", id_pessoa);

        ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_pessoa);
        result_set.next();

        int id_codigo_postal = result_set.getInt("id_codigo_postal");

        // Cria o Medico e os outros elementos necessarios
        int numero_de_colaborador = result_set.getInt("id_colaborador");
        String nome = result_set.getString("nome");
        int id_hospital = result_set.getInt("id_hospital");
        int id_hospital2 = result_set.getInt("id_hospital2");
        char sexo = result_set.getString("sexo").charAt(0);
        int bi = result_set.getInt("bi");
        Date data_de_nascimento = result_set.getDate("data_de_nascimento");
        int nif = result_set.getInt("nif");
        String email = result_set.getString("email");
        int telefone = result_set.getInt("telefone");
        int telemovel = result_set.getInt("telemovel");
        String morada = result_set.getString("morada");
        String grupo_sanguineo = result_set.getString("grupo_sanguineo");
        String nib = result_set.getString("nib");
        String nss = result_set.getString("nss");
        Date data_admissao = result_set.getDate("data_admissao");
        Double vencimento = result_set.getDouble("vencimento");
        Date validade_contrato = result_set.getDate("validade_contrato");
        String horario_trabalho = result_set.getString("horario_trabalho");
        String horario_trabalho2 = result_set.getString("horario_trabalho2");
        String especialidade = result_set.getString("especialidade");

        acesso_bd.fechaLigacao();

        CodigoPostal codigo_postal = CodigoPostal.devolve(id_codigo_postal);

        Medico medico = new Medico(id_pessoa, nome, sexo, bi, data_de_nascimento, nif, email, telefone, telemovel, morada, grupo_sanguineo,
                codigo_postal, nib, nss, data_admissao, vencimento, validade_contrato, horario_trabalho, numero_de_colaborador, especialidade,
                id_hospital, horario_trabalho2, id_hospital2);

        medico.toString();

        return medico;
    }

    //Catia 27 abr
    public static LinkedList<Medico> devolvePorEspecialidadeHospital(final String especialidade, final int id_hospital)
            throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {

        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();

        String qryName = new String("devolve_medico_por_especialidade_por_hospital");

        Hashtable<String, Object> medicos = new Hashtable<String, Object>();
        medicos.put("var_especialidade", especialidade);
        medicos.put("var_id_hospital", id_hospital);

        ResultSet result_set = acesso_bd.executaSelect(qryName, medicos);

        LinkedList<Medico> lista_medicos = new LinkedList<Medico>();

//Dani28_4{
        while (result_set.next()) {
            int id_medico = result_set.getInt("id_pessoa");
            Medico medico = Medico.devolve(id_medico);
            lista_medicos.add(medico);

        }
//}Dani28_4
        return lista_medicos;

    }

    //Catia 27 abr
    public static void insere(final Hashtable<String, Object> tabela_dados_medico)
            throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {

        Colaborador.insereMedico(tabela_dados_medico);
    }

    public static void altera(final Hashtable<String, Object> dados_colaborador)
            throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        Colaborador.alteraMedico(dados_colaborador);
    }

    public Hashtable<String, Object> toHashtable() {
        Hashtable<String, Object> dados_pessoa = super.toHashtable();

        dados_pessoa.put("var_especialidade", this.getEspecialidade());

        return dados_pessoa;
    }

    public void gravaParaBaseDeDados()
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        super.gravaParaBaseDeDados();

        Medico.altera(this.toHashtable());
    }
    
}
